#include "Personnage.h"

Personnage::Personnage(int id):id_(id),pos_(),vie_(100)
{


    sprite_='@';
    setLastPos(pos_);

}
Personnage::Personnage(int x,int y,char s,int id):id_(id),pos_(x,y),vie_(100),sprite_(s)
{

    setLastPos(pos_);

}
Personnage::Personnage(position a,char s,int id):id_(id),vie_(100),sprite_(s)
{
    pos_=a;
    setLastPos(pos_);
}
Personnage::~Personnage()
{
    //dtor
}
//Déplace le personnage en position (x,y) sans autre forme de verification
void Personnage::deplacer(int x,int y)
{
    setLastPos(pos_);
    pos_.x=x;
    pos_.y=y;

}
void Personnage::deplacer(int dir)
{
    setLastPos(pos_);
    switch(dir){
        case 0:
            pos_.y--;
        break;
        case 1:
            pos_.x++;
        break;
        case 2:
            pos_.y++;
        break;
        case 3:
            pos_.x--;
        break;
        default:
        break;
    }
}
void Personnage::deplacer(position a)
{
    setLastPos(pos_);
    pos_=a;
}
//Retourne la position du personnage sur l'axe des abcisses
int Personnage::getX()
{

    return pos_.x;
}
//Retourne la position du personnage sur l'axe des ordonnées
int Personnage::getY()
{

    return pos_.y;
}
position Personnage::getPos()
{
    return pos_;
}
// Attaquer une cible avec une arme CC

void Personnage::draw()
{
    if(vie_<=0)
        sprite_='X';
    if(vie_>10){
        attron(COLOR_PAIR(1));
        Affichage::affiche(sprite_);
        attroff(COLOR_PAIR(1));
    }else{
          attron(COLOR_PAIR(2));
        Affichage::affiche(sprite_);
        attroff(COLOR_PAIR(2));
    }
}


// Recevoir des degats d'une arme
string Personnage::recevoirAttaque(int degats,int score)
{
    string s(TextManager::to_string(degats));
    s=s+" degats Score : "+TextManager::to_string(score);
    if(score > getDefense()){
        vie_-=degats;
        s=s+" > "+TextManager::to_string(getDefense())+" : "+TextManager::to_string(degats)+" PV de degats";
    }else if (degats-10>0){
        gestionResistance();
        s=s+" < "+TextManager::to_string(getDefense())+" : Une piece d'armure encaisse le coup";
    }else
        s=s+" < "+TextManager::to_string(getDefense())+" : Attaque complètement raté ";
    if(vie_<0){
        vie_ = 0;
    }
    return s;
}
int Personnage::getDegats()
{
    return arme_->getDegats();

}
int Personnage::getScore()
{
    return arme_->getScore();

}
int Personnage::getVie()
{
    return vie_;
}
int Personnage::getDefense()
{
    return jambiere_->getDefense()+armure_->getDefense()+casque_->getDefense()+10;

}
Armes* Personnage::getArme()
{
    return arme_;
}
void Personnage::changerArme(Armes* nouvelleArme)
{
    arme_=nouvelleArme;

}
void Personnage::changerCasque(Casque* nouveauCasque)
{
    casque_=nouveauCasque;

}
void Personnage::changerArmure(Armure* nouvelleArmure)
{

    armure_=nouvelleArmure;

}
void Personnage::changerJambiere(Jambiere* nouvelleJambiere)
{

    jambiere_=nouvelleJambiere;

}
int Personnage::getId()
{
    return id_;
}
void Personnage::collisionMap()
{
    pos_=last_position;
}
void Personnage::collisionObj()
{
    pos_=last_position;
}
void Personnage::setLastPos(position a)
{
    last_position=a;
}
void Personnage::setLastPos(int x,int y)
{
    last_position.x=x;
    last_position.y=y;
}
Inventaire Personnage::getInventaire()
{
	inventaire_.ajoutObjet(arme_);
	inventaire_.ajoutObjet(armure_);
	inventaire_.ajoutObjet(jambiere_);
	inventaire_.ajoutObjet(casque_);
 	return inventaire_;
}

void Personnage::gestionResistance()
{
    int p=randab(0,jambiere_->getDefense()+armure_->getDefense()+casque_->getDefense());
    if(p<jambiere_->getDefense())
        jambiere_->degatProtection();
    else if((p+jambiere_->getDefense())<armure_->getDefense())
         armure_->degatProtection();
    else
         casque_->degatProtection();
}
